﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CREAPA.Dominio;
using CREAPA.Dominio.contrato;
using CREAPA.Repositorio;

namespace CREAPA.RepositorioADO
{
    public class OSRepositorioADO : IRepositorio<OS>
    {
        private Contexto contexto;        

        private void Inserir(OS os)
        {
            os.Descricao = os.Descricao.Replace("'", "");
            var strQuery = "";
            strQuery += "insert into OS(Id,Descricao,DataCadOs,PessoaCadastrou,PessoaInteressado,Problema,Setor,OrigemOS)";

            strQuery += string.Format("values({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}') ", "(select MAX(id)+1 from OS)", os.Descricao, os.DataCadOs, os.PessoaCadastrou, os.PessoaInteressado, os.Problema, os.Setor, 6);

            strQuery += "insert into SituacaoOs(Descricao,Data,IdOS,IdTipoSituacao,PessoaCadastrou)";
            strQuery += string.Format("values('{0}',{1},{2},{3},'{4}') ", "Cadastro da OS", "GETDATE()", "(select MAX(id) from OS)", 1, os.PessoaCadastrou);

            if (os.Anexo.Caminho != null)
            {
                strQuery += "insert into Anexo(IdOS,Data,PessoaCadastrou,Nome,Caminho)";
                strQuery += string.Format("values({0},{1},'{2}','{3}','{4}') ", "(select MAX(id) from OS)", "GETDATE()", os.Anexo.PessoaCadastrou, os.Anexo.Nome, os.Anexo.Caminho);
            }

            using (contexto = new Contexto())
            {
                contexto.ExecutaComando(strQuery);
            }
        }

        public void RegistrarAtendimento(OS os)
        {
            if (os.Descricao != null)
                os.Descricao = os.Descricao.Replace("'", "");
            if (os.DescricaoAnalise != null)
                os.DescricaoAnalise = os.DescricaoAnalise.Replace("'", "");
            var strQuery = "";
            strQuery += "insert into OS(Id,Descricao,DataCadOs,PessoaCadastrou,PessoaInteressado,Problema,Setor,OrigemOS)";

            strQuery += string.Format("values({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}') ", "(select MAX(id)+1 from OS)", os.Descricao, os.DataCadOs, os.PessoaCadastrou, os.PessoaInteressado, os.Problema, os.Setor, os.OrigemOS);

            strQuery += "insert into SituacaoOs(Descricao,Data,IdOS,IdTipoSituacao,PessoaCadastrou)";
            strQuery += string.Format("values('{0}',{1},{2},{3},'{4}') ", "Cadastro da OS", "GETDATE()", "(select MAX(id) from OS)", 1, os.PessoaCadastrou);

            if (os.Analisada)
            {
                strQuery += " UPDATE OS SET ";
                strQuery += string.Format("Analisada = '{0}',", 1);
                strQuery += string.Format("TempoExec = '{0}',", os.TempoExec);
                strQuery += string.Format("Problema = '{0}',", os.Problema);
                strQuery += string.Format("Setor = '{0}',", os.Setor);
                strQuery += string.Format("TempoUnidade = '{0}'", os.TempoUnidade);
                strQuery += string.Format(" WHERE Id = {0};", "(select MAX(id) from OS)");

                strQuery += " insert into SituacaoOs(Descricao,Data,IdOS,IdTipoSituacao,PessoaCadastrou)";
                strQuery += string.Format("values('{0}',{1},{2},{3},'{4}') ", os.DescricaoAnalise, "GETDATE()", "(select MAX(id) from OS)", 2, os.PessoaCadastrou);

            }

            if ((os.Analisada)&&(os.Encerrada))
            {
                strQuery += "UPDATE OS SET ";
                //strQuery += string.Format("Avaliacao = '{0}',", os.Avaliacao);
                strQuery += string.Format("Encerrada = '{0}'", 1);
                strQuery += string.Format(" WHERE Id = {0};", "(select MAX(id) from OS)");

                strQuery += "insert into SituacaoOs(Descricao,Data,IdOS,IdTipoSituacao,PessoaCadastrou)";
                strQuery += string.Format("values('{0}',{1},{2},{3},'{4}') ", null, "GETDATE()", "(select MAX(id) from OS)", 3, os.PessoaCadastrou);
            }

            using (contexto = new Contexto())
            {
                contexto.ExecutaComando(strQuery);
            }
        }

        public void Analisar(OS os)
        {
            if (os.DescricaoAnalise != null)
                os.DescricaoAnalise = os.DescricaoAnalise.Replace("'", "");
            var strQuery = "";
            strQuery += "UPDATE OS SET ";
            strQuery += string.Format("Analisada = '{0}',", 1);
            strQuery += string.Format("TempoExec = '{0}',", os.TempoExec);
            strQuery += string.Format("Problema = '{0}',", os.Problema);
            strQuery += string.Format("Setor = '{0}',", os.Setor);
            strQuery += string.Format("TempoUnidade = '{0}'", os.TempoUnidade);
            strQuery += string.Format(" WHERE Id = {0};", os.Id);

            strQuery += "insert into SituacaoOs(Descricao,Data,IdOS,IdTipoSituacao,PessoaCadastrou)";
            strQuery += string.Format("values('{0}',{1},{2},{3},'{4}') ", os.DescricaoAnalise, "GETDATE()", os.Id, 2, os.PessoaCadastrou);
            
            if (os.Anexo.Caminho != null)
            {
                strQuery += "insert into Anexo(IdOS,Data,PessoaCadastrou,Nome,Caminho)";
                strQuery += string.Format("values({0},{1},'{2}','{3}','{4}') ", os.Id, "GETDATE()", os.Anexo.PessoaCadastrou, os.Anexo.Nome, os.Anexo.Caminho);
            }
            using (contexto = new Contexto())
            {
                contexto.ExecutaComando(strQuery);
            }
        }

        public void Encerrar(OS os)
        {
            if (os.DescricaoAnalise != null)
                os.DescricaoAnalise = os.DescricaoAnalise.Replace("'", "");
            var strQuery = "";
            strQuery += "UPDATE OS SET ";
            strQuery += string.Format("Avaliacao = '{0}',", os.Avaliacao);
            strQuery += string.Format("Encerrada = '{0}'", 1);
            strQuery += string.Format(" WHERE Id = {0};", os.Id);

            strQuery += "insert into SituacaoOs(Descricao,Data,IdOS,IdTipoSituacao,PessoaCadastrou)";
            strQuery += string.Format("values('{0}',{1},{2},{3},'{4}') ", os.DescricaoAnalise, "GETDATE()", os.Id, 3,os.PessoaCadastrou);

            using (contexto = new Contexto())
            {
                contexto.ExecutaComando(strQuery);
            }
        }

        public void Reabrir(OS os) 
        {
            if (os.DescricaoAnalise != null)
                os.DescricaoAnalise = os.DescricaoAnalise.Replace("'", "");
            var strQuery = "";
            strQuery += "UPDATE OS SET ";
            strQuery += string.Format("Analisada = '{0}'", 0);
            strQuery += string.Format(" WHERE Id = {0};", os.Id);

            strQuery += "insert into SituacaoOs(Descricao,Data,IdOS,IdTipoSituacao,PessoaCadastrou)";
            strQuery += string.Format("values('{0}',{1},{2},{3},'{4}') ", os.DescricaoAnalise, "GETDATE()", os.Id, 4, os.PessoaCadastrou);

            if (os.Anexo.Caminho != null)
            {
                strQuery += "insert into Anexo(IdOS,Data,PessoaCadastrou,Nome,Caminho)";
                strQuery += string.Format("values({0},{1},'{2}','{3}','{4}') ", os.Id, "GETDATE()", os.Anexo.PessoaCadastrou, os.Anexo.Nome, os.Anexo.Caminho);
            }

            using (contexto = new Contexto())
            {
                contexto.ExecutaComando(strQuery);
            }
        }

        public void Salvar(OS os)
        {
            Inserir(os);
        }

        public void Excluir(OS os)
        {
            using (contexto = new Contexto())
            {
                var srtQuery = string.Format("DELETE FROM Anexo WHERE IdOS = {0};DELETE FROM SituacaoOs WHERE IdOS = {0};DELETE FROM OS WHERE Id = {0}", os.Id);
                contexto.ExecutaComando(srtQuery);
            }
        }

        public IEnumerable<OS> ListarTodos()
        {
            using (contexto = new Contexto())
            {
                var strQuery = " SELECT * FROM OS";
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader);
            }
        }

        public OS ListarPorId(string Id)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT Id,Descricao,convert(varchar(10),DataCadOs,103)DataCadOs,PessoaCadastrou,PessoaInteressado,Problema,"+
                                "Setor,Avaliacao,Analisada,Encerrada,TempoExec,TempoUnidade,OrigemOS,null Prioridade ,null DescricaoAnalise FROM OS o WHERE Id = {0}", Id);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader).FirstOrDefault();
            }
        }

        public OS ListarPorIdDescricao(string Id)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT o.Id,o.Descricao,DataCadOs,PessoaCadastrou,PessoaInteressado,p.Descricao Problema" +
                            ",s.Nome Setor,Avaliacao,Analisada,Encerrada,TempoExec,TempoUnidade,og.Descricao OrigemOS,null Prioridade,(select Descricao from SituacaoOs so where IdOS=o.id and so.IdTipoSituacao=2)DescricaoAnalise " +
                            " FROM siscrea.dbo.OS o inner join Problema p on o.Problema=p.Id" +
                            " inner join Setor s on o.Setor=s.Id" +
                            " inner join Origem_Os og on o.OrigemOS=og.Id" +
                            " WHERE o.Id = {0}", Id);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader).FirstOrDefault();
            }
        }
       

        public IEnumerable<OS> ListarPorFuncionario(string func)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT o.Id,o.Descricao,DataCadOs,PessoaCadastrou,PessoaInteressado,p.Descricao Problema" +
                            ",s.Nome Setor,Avaliacao,Analisada,Encerrada,TempoExec,TempoUnidade,og.Descricao OrigemOS,null Prioridade,(select top 1 Descricao from SituacaoOs so where IdOS=o.id and so.IdTipoSituacao=2)DescricaoAnalise " +
                            " FROM siscrea.dbo.OS o inner join Problema p on o.Problema=p.Id" +
                            " inner join Setor s on o.Setor=s.Id" +
                            " inner join Origem_Os og on o.OrigemOS=og.Id" +
                            " WHERE PessoaInteressado = '{0}' or PessoaCadastrou  = '{0}' order by o.Id desc", func);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader);
            }
        }

        public IEnumerable<OS> ListarPorFuncionarioPend(string func)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT o.Id,o.Descricao,DataCadOs,PessoaCadastrou,PessoaInteressado,p.Descricao Problema" +
                            ",s.Nome Setor,Avaliacao,Analisada,Encerrada,TempoExec,TempoUnidade,og.Descricao OrigemOS,null Prioridade,(select  top 1 Descricao from SituacaoOs so where IdOS=o.id and so.IdTipoSituacao=2 order by Data desc)DescricaoAnalise " +
                            " FROM siscrea.dbo.OS o inner join Problema p on o.Problema=p.Id" +
                            " inner join Setor s on o.Setor=s.Id" +
                            " inner join Origem_Os og on o.OrigemOS=og.Id" +
                            " WHERE (PessoaInteressado = '{0}') and (Analisada=0 or Encerrada=0) order by o.Id desc", func);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader);
            }
        }

        public IEnumerable<OS> ListarOsPendAnalise(string func)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT o.Id,o.Descricao+"+
" (case when (select top 1 IdOS from SituacaoOs s1 where IdTipoSituacao=4 and s1.IdOS=o.Id)is not null " +
" then ' (REABERTO). '+ (select Descricao from SituacaoOs s1 where IdTipoSituacao=4 and s1.IdOS=o.Id "+
" and s1.Data = (select MAX(Data) from SituacaoOs s1 where IdTipoSituacao=4 and s1.IdOS=o.Id)) else '' END) Descricao,DataCadOs,PessoaCadastrou,PessoaInteressado,p.Descricao Problema" +
                                            ",s.Nome Setor,Avaliacao,Analisada,Encerrada,o.TempoExec,TempoUnidade,og.Descricao OrigemOS,(select top 1 Descricao from SituacaoOs so where IdOS=o.id and so.IdTipoSituacao=2)DescricaoAnalise, pr.Descricao Prioridade " +
                                            " FROM siscrea.dbo.OS o inner join Problema p on o.Problema=p.Id"+
						                    " inner join Setor s on o.Setor=s.Id"+
						                    " inner join Origem_Os og on o.OrigemOS=og.Id"+
                                            " inner join Prioridade pr on pr.Id=p.Prioridade" +
                                            " WHERE Setor in (select IdSetor from Funcionario where Login='{0}' union select Setor from FuncionarioSetor where Login='{0}') and Analisada=0 order by DataCadOs desc",func);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader);
            }
        }

        public IEnumerable<OS> ListarTodasSetor(string func)
        {
            using (contexto = new Contexto())
            {
                var strQuery = String.Format(" SELECT o.Id,o.Descricao,DataCadOs,PessoaCadastrou,PessoaInteressado,p.Descricao Problema" +
                                            ",s.Nome Setor,Avaliacao,Analisada,Encerrada,TempoExec,null Prioridade,TempoUnidade,og.Descricao OrigemOS,(select top 1 Descricao from SituacaoOs so where IdOS=o.id and so.IdTipoSituacao=2 order by Data desc)DescricaoAnalise " +
                                            " FROM siscrea.dbo.OS o inner join Problema p on o.Problema=p.Id" +
                                            " inner join Setor s on o.Setor=s.Id" +
                                            " inner join Origem_Os og on o.OrigemOS=og.Id" +
                                            " WHERE Setor = (select IdSetor from Funcionario where Login='{0}') order by DataCadOs desc", func);
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retornoDataReader);
            }
        }

        private List<OS> TransformaReaderEmListaDeObjeto(SqlDataReader reader)
        {

            var os = new List<OS>();
            while (reader.Read())
            {
                var TemObjeto = new OS()
                {
                    Id = int.Parse(reader["Id"].ToString()),
                    Descricao = reader["Descricao"].ToString(),
                    DataCadOs = DateTime.Parse(reader["DataCadOs"].ToString()),
                    PessoaCadastrou = reader["PessoaCadastrou"].ToString(),
                    Avaliacao = reader["Avaliacao"] != DBNull.Value ? reader["Avaliacao"].ToString() : "",
                    TempoExec = reader["TempoExec"]!= DBNull.Value ? int.Parse(reader["TempoExec"].ToString()):0,
                    Encerrada = bool.Parse(reader["Encerrada"].ToString()),
                    Problema = reader["Problema"].ToString(),
                    Analisada = bool.Parse(reader["Analisada"].ToString()),
                    PessoaInteressado = reader["PessoaInteressado"].ToString(),
                    TempoUnidade = reader["TempoUnidade"]!= DBNull.Value ? char.Parse(reader["TempoUnidade"].ToString()):'N',
                    Setor = reader["Setor"].ToString(),
                    DescricaoAnalise = reader["DescricaoAnalise"].ToString(),
                    Prioridade = reader["Prioridade"].ToString(),
                    OrigemOS = reader["OrigemOS"]!= DBNull.Value ? reader["OrigemOS"].ToString():"6",
                 };
                os.Add(TemObjeto);
            }
            reader.Close();
            return os;
        }
    }
}






